Android应用安装

一、关键词解释:

1. SQLite:

SQLite是android系统自带的一款轻量级数据库,可以存储一些临时文件

2. 签名:

就像一些重大决定和文件需要我们手动签名一样,实际上在Android的世界里,签名起着一个应用的识别和告知其作者身份的作用,自己应用的无缝升级,ContentProvider的使用,都依赖签名

3. SharePreference(share prefs):

存储数据类型:SharePreference是一个轻量级的存储机制。只能存储一些基本类型,boolean,int,float,long,String
路径:路径为data/data/包名/share_prefs/文件名.xml。
存储形式:以xml为载体,存储时类似于Map,key-value键值对。

4. 静默安装:

静默安装顾名思义,就是静静的,默默的装上一个应用,在安装的过程当中用户是不知情的

5. ContentProvider:

Android四大组件,可以允许两个独立应用互相暴露、使用数据

二、 Android的安装方式

1. 系统应用安装:

PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务
(源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java)
PackageManagerService服务启动的流程:
a. 首先扫描安装“system\framework”目录下的jar包
scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM scanMode | SCAN_NO_DEX);
b. 第二步扫描安装“system\app”目录下的各个系统应用
scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);
c. 第三步扫描“data\app”目录,即用户安装的第三方应用 scanDirLI(mAppInstallDir, 0, scanMode);
d. 第四步扫描” data\app-private”目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)

2. 从market上下载应用:

a. 当应用在手机市场下载完成之后,会自动调用接口

public void install Package(final Uri packageURI, final IPackageInstallObserver observer,final int flags)

b. 将apk文件复制到临时目录下,解析临时文件,获取应用包名
c. 判断如果带有参数

INSTALL_REPLACE_EXISTING

d. 之后则与开机应用安装流程相同

  1. adb工具安装:
    与market安装调用的接口相同
  2. 静默安装:
    a. apk签名必须与系统签名一致
    b. 必须root
    请注意:以上两项满足其一,然后编辑android工程中的Manifest.XML文件,添加权限

    android.permission.INSTALL_PACKAGES

  3. 系统应用安装和第三方安装(adb安装)区别:
    实际上系统应用安装和第三方安装没有办法去做比较,只是阶段不一罢了,实际上第三方安装最后也是要走到系统安装这一步的,只不过当我们在使用第三方安装的 时 候,先走第三方安装阶段,然后是系统应用安装阶段,只有一点例外,就是系统应用不会走第三方安装,例如:系统版本更新,摄像头、计算器,键盘升级等
    三、 Android覆盖安装与安装区别
    Android覆盖安装与安装区别
    正常安装(删除旧版本APK之后重新进行安装) 覆盖安装(不删除之前的旧版本包,直接安装)
    SQLite的数据也会被删除 SQLite的数据不会丢失
    shared_prefs中的数据会被删除 shared_prefs中的数据不会丢失
    4.4之前的版本不会比较apk的Version_code 4.4以上版本比较apk的Version_code
    四、测试需要注意的点以及会引发的问题
  4. 容易引发的问题
    a. SQLite数据不会丢失,当覆盖安装时,会对比SQLite数据库信息,但是没有比对上不会在界面上提示报错
    b. Shared prefs中的数据有保存,那么之前用户设置的一些东西都会保存
    c. Android版本比较多,而且比较复杂,市场持有度又都非常高,导致版本的更新和对低版本的支持成为问题,例如:android4.4之后覆盖安装会对比Version_code
  5. 测试人员需要注意的点
    a. SQLite数据库更新后,如果没有对比成功则覆盖安装失败且用户无感知,这个是个很大的问题,所以在之后的测试当中,需要关注是否有public voidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)的逻辑来更新SQLite
    b. Shared prefs中的数据保存会保存之前用户的一些设置历史,那么新的版本和旧的版本之间的功能更新,减去,如果恰巧历史数据保存的正好是功能改动的部分,那么就可能会出现问题
    c. Android的版本问题一直都是BUG出现最多的地方,覆盖安装的问题在与Android4.4之前,覆盖安装不会判断version_code,所以安装可以不考虑,但是在4.4之后会判断version_code,如果比之前的小,是不可以安装的
  6. 解决方式
    a.查看代码当中的是否有void onUpdate()方法,可以使用静态代码扫描的方式来解决
    b.查看代码中是否有使用到sharePreference对象,如果有,是否有逻辑使得sharePreference正常更新
    c.查看Android的系统版本,如果>4.4,那么使用adb命令:adb install apk路径,查看是否会报错,同时也可以加入静态代码扫描的规则中。
    五、iOS的安装与覆盖安装:
    iOS的安装和升级同一都走AppleStore,所以具有非常好的封装性,而且是闭源的,所以覆盖安装和正常的安装都是在APPleStore的监督之下完成的,基本相同